//以后store文件夹里面index文件，就是与vuex仓库相关的文件!!!
import Vue from 'vue';
//引入vuex插件,vuex插件对外暴露是一个对象【插件对象:install方法】
import Vuex from 'vuex';
//使用插件:Vue.use();
Vue.use(Vuex);

//创建咱们仓库
//Vuex插件对象,身上有一个Store方法,它是一个构造函数。执行会返回一个Store类的一个实例【仓库】
let store = new Vuex.Store({
    //存储数据的地方
    state: {
        count: 1,
        hobby: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    },
    //是唯一可以修改state里面数据地方
    mutations: {
        //唯一修改修改数据的地方
        //第一个参数:state即为当前仓库的数据
        ADD(state) {
            state.count++;
        }
        ,
        MINUS(state) {
            state.count--;
            //this即为当前仓库，Store类的实例,就是不用！！
        },
        ADDNINE(state, payload) {
            state.count += payload;
        },
        UPDATECOUNT(state,payload){
            state.count = payload;
        }
    },
    //书写业务逻辑,比如书写if、异步语句等等。但是这里不能直接修改数据！！！
    actions: {
        //处理add类型的action
        //miniStore就是一个对象(小仓库)拥有的方法基本与Store类的实例一模一样！！！
        add({ commit, state, dispatch }) {
            //生活例子:相当于add这个办公室这个人，已经同意这次申请【出现commit】
            //这次同意人家告诉你了,找叫做ADD这个工人去处理这个修改!!!
            commit("ADD");
        },
        //处理minus类型的action
        //commit:提交mutation方法
        //state:即为当前仓库存储的数据
        //dispatch:派发小弟用的方法
        minus({ commit, state, dispatch }) {
            commit("MINUS");
            //this即为当前仓库:Store类的实例。在vuex中不用this
        },
        evenAdd({ commit, state, dispatch }) {
            //生活例子:这次办事,并不是立马就答应了。有条件了【业务判断】
            if (state.count % 2 == 0) {
                commit('ADD');
            } else {
                console.log('不符合条件,暂时不处理');
            }

        },
        oddMinus({ commit, state, dispatch }) {
            if (state.count % 2 != 0) {
                commit("MINUS")
            } else {
                console.log('不符合条件,不受理');
            }
        },
        //第一个参数:miniStore小仓库
        addNine({ commit, state, dispatch }, payload) {
            //相当于(同意):你去找名字ADDNINE这个工人,携带一些信息【信里面:VC让我给你带的信息】
            commit("ADDNINE", payload);
        }
        ,
        //delayAdd类型的action
        delayAdd({ commit, state, dispatch }) {
            //可以书写异步语句
            //异步语句:定时器、延迟器、ajax、promise等等
            setTimeout(() => {
                commit("ADD");
            }, 2000);

        },
        updateCount({commit,state,dispatch},payload){
             commit('UPDATECOUNT',payload);
        }
    },
    //理解为仓库中的计算属性
    getters: {
        //state,即为仓库中的数据
        total(state) {
            //注意:getters里面的函数this->undefined
            //这里即为计算属性，伺候仓库，利用已有的属性与属性值，造出一个新的属性与属性值!!!!
            return state.hobby.reduce((a, b) => a + b, 0)
        }
    }
});
//对外暴露仓库:暴露的仓库到底是什么鬼?
//暴露的仓库实质即为Store类的一个实例而已！！！
export default store;

